/*=========================================================================

Program:   Visualization Toolkit
Module:    $RCSfile: vtkPointLocatorEx.h,v $

Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
// .NAME vtkPointLocatorEx - merge exactly coincident points
// .SECTION Description
// vtkPointLocatorEx is a locator object to quickly locate points in 3D.
// The primary difference between vtkPointLocatorEx and its superclass
// vtkPointLocator is that vtkPointLocatorEx merges precisely coincident points
// and is therefore much faster.
// .SECTION See Also
// vtkCleanPolyData

#ifndef __vtkPointLocatorEx_h
#define __vtkPointLocatorEx_h

#include "vtkPointLocator.h"

class VTK_EXPORT vtkPointLocatorEx : public vtkPointLocator
{
public:
	static vtkPointLocatorEx *New();
	vtkTypeRevisionMacro(vtkPointLocatorEx,vtkPointLocator);
	void PrintSelf(ostream& os, vtkIndent indent);

	// Description:
	// Determine whether point given by x[3] has been inserted into points list.
	// Return id of previously inserted point if this is true, otherwise return
	// -1. This method is thread safe.
	virtual vtkIdType IsInsertedPoint(const double x[3]);

	// Description:
	// Determine whether point given by x[3] has been inserted into points list.
	// Return 0 if point was already in the list, otherwise return 1. If the
	// point was not in the list, it will be ADDED.  In either case, the id of
	// the point (newly inserted or not) is returned in the ptId argument.
	// Note this combines the functionality of IsInsertedPoint() followed
	// by a call to InsertNextPoint().
	virtual int InsertUniquePoint(const double x[3], vtkIdType &ptId);

protected:
	vtkPointLocatorEx() {};
	~vtkPointLocatorEx() {};

private:
	vtkPointLocatorEx(const vtkPointLocatorEx&);  // Not implemented.
	void operator=(const vtkPointLocatorEx&);  // Not implemented.
};

#endif


